﻿#include <iostream>
#include <vector>
#include <map>

using namespace std;

//C++98
//struct func1
//{
//	int _x;
//	int _y;
//};
//
//int main()
//{
//	//初始化数组
//	int array1[] = { 1, 2, 3, 4, 5 };
//	int array2[5] = { 0 };
//	//初始化结构体
//	func1 p = { 1, 2 };
//	return 0;
//}



	
//C++11
//class Date
//{
//public:
//	//friend ostream& operator<<(ostream& out, const Date& d);
//
//	Date(int year = 1, int month = 1, int day = 1)
//		:_year(year)
//		, _month(month)
//		, _day(day)
//	{
//		cout << "Date(int year, int month, int day)" << endl;
//	}
//	Date(const Date& d)
//		:_year(d._year)
//		, _month(d._month)
//		, _day(d._day)
//	{
//		cout << "Date(const Date& d)" << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//	// //ostream& operator<<(ostream& out, const Date& d)
//	//{
//	//	out << d._year << " " << d._month << " " << d._day << endl;
//	//	return out;
//	//}
//
//int main()
//{
//	// 内置类型支持
//	int x1 = { 2 };
//	// 自定义类型支持
//	// 这里本质是用{ 2025, 1, 1}构造一个Date临时对象
//	// 再用临时对象拷⻉构造d1，编译器优化后合⼆为一，变成{ 2025, 1, 1}直接构造初始化d1
//	// 运行一下，可以发现是没调用拷贝构造的
//	Date d1 = { 2025, 1, 1 };
//
//	vector<Date> v1;
//	v1.push_back(d1);
//	v1.push_back(Date(2025, 5, 10));
//	// 比起有名对象和匿名对象传参，这⾥{}更有性价比
//	v1.push_back({ 2025, 5, 30 });
//
//
//	return 0;
//}

//auto il = { 10, 20, 30 }; 
	
//initializer_list
//int main()
//{
//	// initializer_list版本的构造支持任意个数的值初始化
//	vector<int> v = { 1,2,3,4,5,6,7 };
//
//	// initializer_list版本的赋值
//	 v = { 1,2,3 };
//
//	// v1是直接构造，v2是构造临时对象+临时对象拷⻉赋值给v2=优化为直接构造
//	vector<int> v1({ 1,2,3,4,5 });
//	vector<int> v2 = { 1,2,3,4,5 };
//
//	// 这里是pair对象的{}初始化和map的initializer_list构造结合到⼀起使用
//	map<string, string> dict = { {"left", "左边，剩余"}, {"string", "字符串"} };
//
//	return 0;
//}

//右值引用和移动语义

//左值和右值
//int main()
//{
//	//左值： a, b，*b
//	int a = 1;
//	int* b = new int(11);
//	*b = 10;
//
//	int x = 1, y = 2;
//	// 右值10，x + y，fmin(x, y)，string("11111")
//	10;
//	x + y;
//	fmin(x, y);
//	string("11111");
//
//
//	//cout << &10 << endl;
//	//cout << &(x+y) << endl;
//	//cout << &(fmin(x, y)) << endl;
//	//cout << &string("11111") << endl;
//
//	return 0;
//}

//左值引用和右值引用

//int main()
//{
//	
//
//	return 0;
//}